//
//  EmoticonViewModel.swift
//  表情键盘
//
//  Created by wxy on 15/9/14.
//  Copyright © 2015年 wxy. All rights reserved.
//

import UIKit

// 表情的视图模型 -> 加载表情数据
/*
    从Emoticon.bundle 中读取 emotiocns.plist
    遍历 packeages 数组 创建 EmoticonPackage 数组
    EmoticonPackage 的明细内容 从 id 对应的目录 加载 info.plist 完成字典转模型

    - 在 Swift 中，一个对象可以不继承自 NSObject
    - 继承自 NSObject 可以使用 KVC 方法给属性设置数值 => 如果是模型对象 最好还是使用 NSObject
    - 如果对象没有属性 或不依赖 KVC 可以建立一个没有父类的对象 对象的量级比较轻 内存消耗小
*/
class EmoticonViewModel {

    // 单例
    static let sharedViewModel = EmoticonViewModel()
    
    // private 修饰符能保证外界只能通过单例属性访问对象，不能实例化
    private init() {
        // 加载表情包
        loadPackages()
    }
    
    // 表情包数组
    lazy var packages = [EmoticonPackage]()
    
    // 添加最近的表情
    func favourite(indexPath: NSIndexPath) {
        
        // 0. 如果是第0个分组 参与排序
        if indexPath.section == 0 {
            return
        }
        
        // 1. 获取表情符号
        let em = emoticon(indexPath)
        em.times++
        
        // 2. 将表情符号添加到第0组的首位
        // 判断是否已经存在表情
        if !packages[0].emoticons.contains(em) {
            packages[0].emoticons.insert(em, atIndex: 0)
        }
        
        // 3. 对数组进行排序 直接排序当前数组 sortInPlace
        // Swift中 对尾随闭包 同时有返回值的又一个简单地写法
//        packages[0].emoticons.sortInPlace { (obj1, obj2) -> Bool in
//            return obj1.times > obj2.times
//        }
        
        // $0 对应第一个参数 $1 对应第二个参数 依次类推 return 可以省略
        packages[0].emoticons.sortInPlace {$0.times > $1.times}
        
        // 4. 删除多余的表情 - 倒数第二个
        if packages[0].emoticons.count > 21 {
            packages[0].emoticons.removeAtIndex(19)
        }
    
        // 数组调试技巧
        // printLog(packages[0].emoticons as NSArray)
        // printLog(packages[0].emoticons.count)
        
    }
    
    // 根据 indexPath 返回对应的表情模型
    func emoticon(indexPath: NSIndexPath) -> Emoticon {
        
        return packages[indexPath.section].emoticons[indexPath.item]
    }
    
    // MARK: - 私有函数
    // 加载表情包
    private func loadPackages() {
        
        // 0. 增加最近分组
        packages.append(EmoticonPackage(dict: ["group_name_cn": "最近"]))
        
        // 1. 读取plist
        let path = NSBundle.mainBundle().pathForResource("emoticons.plist", ofType: nil, inDirectory: "Emoticons.bundle")
        
        // 2. 读取字典
        let dict = NSDictionary(contentsOfFile: path!)
        
        // 3. 获取 packages 数组
        let array = dict!["packages"] as! [[String: AnyObject]]
        
        // 4. 遍历数组，创建模型
        for infoDict in array {
            
            // 1> 获取 id，目录对应的 info.plist 才是表情包的数据
            let id = infoDict["id"] as! String
            
            // 2> 拼接表情包路径
            let emPath = NSBundle.mainBundle().pathForResource("info.plist", ofType: nil, inDirectory: "Emoticons.bundle/" + id)
            
            // 3> 加载 info.plist 字典
            let packageDict = NSDictionary(contentsOfFile: emPath!) as! [String: AnyObject]
            
            // 4> 字典转模型
            packages.append(EmoticonPackage(dict: packageDict))
        }
        // print(packages)
    }
    
}
